// 用户信息验证模块
const joi  = require('joi')


// 在nodeJS项目中使用Joi包做表单验证并自定义每个字段错误描述

// 用户名的验证规则
const username = joi.string().alphanum().min(2).max(10).required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.alphanum':
                return new joi.ValidationError('用户名只能包含a-zA-Z0-9')
            case 'string.min':
                return new joi.ValidationError('用户名最小长度为2')
            case 'string.max':
                return new joi.ValidationError('用户名最大长度为10')
            case 'string.empty':
                return new joi.ValidationError('用户名不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交用户名')
        }
    }
})

//密码验证规则
const password = joi.string().pattern(new RegExp('^[\\S]{6,12}$')).required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.pattern.base':
                return new joi.ValidationError('密码必须是6-12位的非空字符')
            case 'string.empty':
                return new joi.ValidationError('密码不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交密码')
        }
    }
})


// const id = joi.number().integer().min(1).required().error(errors=>{
//     console.log(errors);
//     for (err of errors){
//         switch (err.code) {
//             case 'number.base':
//                 return new joi.ValidationError('id必须为数字')
//             case 'number.min':
//                 return new joi.ValidationError('id必须大于1')
//             case 'number.integer':
//                 return new joi.ValidationError('id必须为整数')
//             case 'any.required':
//                 return new joi.ValidationError('必须提交id')
//         }
//     }
// })


// 定义nickname、email的验证规则
const nickname = joi.string().required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.empty':
                return new joi.ValidationError('昵称不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交昵称')
        }
    }
})


const email = joi.string().email().required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.email':
                return new joi.ValidationError('邮箱不合法')
            case 'string.empty':
                return new joi.ValidationError('邮箱不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交邮箱')
        }
    }
})


//重置密码的验证规则--旧密码
const oldPwd = joi.string().pattern(new RegExp('^[\\S]{6,12}$')).required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.pattern.base':
                return new joi.ValidationError('旧密码必须是6-12位的非空字符')
            case 'string.empty':
                return new joi.ValidationError('旧密码不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交旧密码')
                
        }
    }
})



//重置密码的验证规则--新密码
const newPwd = joi.not(joi.ref('oldPwd')).concat(oldPwd).error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.empty':
                return new joi.ValidationError('新密码不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交新密码')
            case 'string.pattern.base':
                return new joi.ValidationError('新密码必须是6-12位的非空字符')
            case 'any.invalid':
                return new joi.ValidationError('新密码不能跟旧密码相同')
        }
    }
})


//用户头像验证规则 base64字符串
const avatar = joi.string().dataUri().required().error(errors=>{
    for (err of errors){
        switch (err.code) {
            case 'string.empty':
                return new joi.ValidationError('头像不能为空')
            case 'any.required':
                return new joi.ValidationError('必须提交头像')
            case 'string.dataUri':
                return new joi.ValidationError('头像必须是base64格式的字符')
        }
    }
})




//定义并共享注册和登录表单的验证规则对象
exports.reg_login_schema = {
    // 表示需要对req.body中的数据进行验证
    body: {
        username,
        password
    }
}

//定义并共享更新用户基本信息的验证规则对象
exports.update_userinfo_schema = {
    // 表示需要对req.body中的数据进行验证
    body: {
        nickname,
        email,
        // id
    }
}


// 验证规则对象--重置密码
exports.updatepwd_schema = {
    body: {
        oldPwd,
        newPwd
    }
}


// 验证规则对象--更新头像
exports.update_avatar_schema = {
    body: {
        avatar
    }
}